简书链接:原创android利用反射禁止popwindow截屏(做键盘开发) 文章字数:60,阅读全文大约需要1分钟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 try { Field windowManagerField = PopupWindow.class.getDeclaredField("mWindowManager"); windowManagerField.setAccessible(true); final Object o = windowManagerField.get(mPreviewPopup); Object windowManagerProy = Proxy.newProxyInstance(Handler.class.getClassLoader(), new Class[]{WindowManager.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // if( public void addView(View view, ViewGroup.LayoutParams params);) if (method.getName().equals("addView") && args.length == 2) { PopupWrapper.this.mDecorView = args[0]; PopupWrapper.this.mWindowParams = (WindowManager.LayoutParams) args[1]; PopupWrapper.this.screenShot(mSafeEditView.isDisableCatupreScreen()); } return method.invoke(o, args); } }); windowManagerField.set(mPreviewPopup, windowManagerProy); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } public void screenShot(boolean disableCapture) { if (disableCapture) { addFlags(WindowManager.LayoutParams.FLAG_SECURE); } else { clearFlags(WindowManager.LayoutParams.FLAG_SECURE);//避免导致 吧activity的防止截屏给取消了。理论上 activity设置就ok了。 } } public WindowManager.LayoutParams getAttributes() { return mWindowParams; } public void clearFlags(int flags) { setFlags(0, flags); } public void setFlags(int flags, int mask) { final WindowManager.LayoutParams attrs = getAttributes(); if (attrs == null) { return; } attrs.flags = (attrs.flags & ~mask) | (flags & mask); } public void addFlags(int flags) { setFlags(flags, flags); }